home *** CD-ROM | disk | FTP | other *** search
/ FishMarket 1.0 / FishMarket v1.0.iso / fishies / 051-075 / disk_069 / make / rules.c < prev   
C/C++ Source or Header  |  1992-05-06  |  6KB  |  252 lines

  1. /*
  2.  *    Control of the implicit suffix rules
  3.  */
  4.  
  5.  
  6. #include "h.h"
  7. #ifndef NULL
  8. #define NULL ((void *) 0)
  9. #endif
  10.  
  11. /*
  12.  * Return a pointer to the suffix of a name 
  13.  */
  14. char           *
  15. suffix(name)
  16.     char           *name;
  17. {
  18.     return rindex(name, '.');
  19. }
  20.  
  21.  
  22. /*
  23.  *    Dynamic dependency.  This routine applies the suffis rules
  24.  *    to try and find a source and a set of rules for a missing
  25.  *    target.  If found, np is made into a target with the implicit
  26.  *    source name, and rules.  Returns TRUE if np was made into
  27.  *    a target.
  28.  */
  29. bool
  30. dyndep(np)
  31.     struct name    *np;
  32. {
  33.     register char  *p;
  34.     register char  *q;
  35.     register char  *suff;    /* Old suffix  */
  36.     register char  *basename;    /* Name without suffix  */
  37.     struct name    *op;        /* New dependent  */
  38.     struct name    *sp;        /* Suffix  */
  39.     struct line    *lp;
  40.     struct depend  *dp;
  41.     char           *newsuff;
  42.     void        modtime();
  43.  
  44.  
  45.     p = str1;
  46.     q = np->n_name;
  47.     if (!(suff = suffix(q)))
  48.     return FALSE;        /* No suffix */
  49.     while (q < suff)
  50.     *p++ = *q++;
  51.     *p = '\0';
  52.     basename = setmacro("*", str1)->m_val;
  53.  
  54.     if (!((sp = newname(".SUFFIXES"))->n_flag & N_TARG))
  55.     return FALSE;
  56.  
  57.     for (lp = sp->n_line; lp; lp = lp->l_next)
  58.     for (dp = lp->l_dep; dp; dp = dp->d_next) {
  59.         newsuff = dp->d_name->n_name;
  60.         if (strlen(suff) + strlen(newsuff) + 1 >= LZ)
  61.         fatal("Suffix rule too long");
  62.         p = str1;
  63.         q = newsuff;
  64.         while (*p++ = *q++);
  65.         p--;
  66.         q = suff;
  67.         while (*p++ = *q++);
  68.         sp = newname(str1);
  69.         if (sp->n_flag & N_TARG) {
  70.         p = str1;
  71.         q = basename;
  72.         if (strlen(basename) + strlen(newsuff) + 1 >= LZ)
  73.             fatal("Implicit name too long");
  74.         while (*p++ = *q++);
  75.         p--;
  76.         q = newsuff;
  77.         while (*p++ = *q++);
  78.         op = newname(str1);
  79.         if (!op->n_time)
  80.             modtime(op);
  81.         if (op->n_time) {
  82.             dp = newdep(op, NULL);
  83.             newline(np, dp, sp->n_line->l_cmd, 0);
  84.             setmacro("<", op->n_name);
  85.             return TRUE;
  86.         }
  87.         }
  88.     }
  89.     return FALSE;
  90. }
  91.  
  92.  
  93. /*
  94.  *    Make the default rules
  95.  */
  96. void
  97. makerules()
  98. {
  99.     struct cmd     *cp;
  100.     struct name    *np;
  101.     struct depend  *dp;
  102.  
  103.  
  104. #ifdef eon
  105.     setmacro("BDSCC", "asm");
  106.     /* setmacro("BDSCFLAGS", "");     */
  107.     cp = newcmd("$(BDSCC) $(BDSCFLAGS) -n $<", 0);
  108.     np = newname(".c.o");
  109.     newline(np, 0, cp, 0);
  110.  
  111.     setmacro("CC", "c");
  112.     setmacro("CFLAGS", "-O");
  113.     cp = newcmd("$(CC) $(CFLAGS) -c $<", 0);
  114.     np = newname(".c.obj");
  115.     newline(np, 0, cp, 0);
  116.  
  117.     setmacro("M80", "asm -n");
  118.     /* setmacro("M80FLAGS", "");     */
  119.     cp = newcmd("$(M80) $(M80FLAGS) $<", 0);
  120.     np = newname(".mac.o");
  121.     newline(np, 0, cp, 0);
  122.  
  123.     setmacro("AS", "zas");
  124.     /* setmacro("ASFLAGS", "");     */
  125.     cp = newcmd("$(ZAS) $(ASFLAGS) -o $@ $<", 0);
  126.     np = newname(".as.obj");
  127.     newline(np, 0, cp, 0);
  128.  
  129.     np = newname(".as");
  130.     dp = newdep(np, 0);
  131.     np = newname(".obj");
  132.     dp = newdep(np, dp);
  133.     np = newname(".c");
  134.     dp = newdep(np, dp);
  135.     np = newname(".o");
  136.     dp = newdep(np, dp);
  137.     np = newname(".mac");
  138.     dp = newdep(np, dp);
  139.     np = newname(".SUFFIXES");
  140.     newline(np, dp, 0, 0);
  141. #endif
  142.  
  143. /*
  144.  *    Some of the UNIX implicit rules
  145.  */
  146. #ifdef unix
  147.     setmacro("CC", "cc");
  148.     setmacro("CFLAGS", "-O");
  149.     cp = newcmd("$(CC) $(CFLAGS) -c $<", 0);
  150.     np = newname(".c.o");
  151.     newline(np, 0, cp, 0);
  152.  
  153.     setmacro("AS", "as");
  154.     cp = newcmd("$(AS) -o $@ $<", 0);
  155.     np = newname(".s.o");
  156.     newline(np, 0, cp, 0);
  157.  
  158.     setmacro("YACC", "yacc");
  159.     /* setmacro("YFLAGS", "");     */
  160.     cp = newcmd("$(YACC) $(YFLAGS) $<", 0);
  161.     cp = newcmd("mv y.tab.c $@", cp);
  162.     np = newname(".y.c");
  163.     newline(np, 0, cp, 0);
  164.  
  165.     cp = newcmd("$(YACC) $(YFLAGS) $<", 0);
  166.     cp = newcmd("$(CC) $(CFLAGS) -c y.tab.c", cp);
  167.     cp = newcmd("rm y.tab.c", cp);
  168.     cp = newcmd("mv y.tab.o $@", cp);
  169.     np = newname(".y.o");
  170.     newline(np, 0, cp, 0);
  171.  
  172.     np = newname(".s");
  173.     dp = newdep(np, 0);
  174.     np = newname(".o");
  175.     dp = newdep(np, dp);
  176.     np = newname(".c");
  177.     dp = newdep(np, dp);
  178.     np = newname(".y");
  179.     dp = newdep(np, dp);
  180.     np = newname(".SUFFIXES");
  181.     newline(np, dp, 0, 0);
  182. #endif
  183. #ifdef os9
  184. /*
  185.  *    Fairlight use an enhanced version of the C sub-system.
  186.  *    They have a specialised macro pre-processor.
  187.  */
  188.     setmacro("CC", "cc");
  189.     setmacro("CFLAGS", "-z");
  190.     cp = newcmd("$(CC) $(CFLAGS) -r $<", 0);
  191.  
  192.     np = newname(".c.r");
  193.     newline(np, 0, cp, 0);
  194.     np = newname(".ca.r");
  195.     newline(np, 0, cp, 0);
  196.     np = newname(".a.r");
  197.     newline(np, 0, cp, 0);
  198.     np = newname(".o.r");
  199.     newline(np, 0, cp, 0);
  200.     np = newname(".mc.r");
  201.     newline(np, 0, cp, 0);
  202.     np = newname(".mca.r");
  203.     newline(np, 0, cp, 0);
  204.     np = newname(".ma.r");
  205.     newline(np, 0, cp, 0);
  206.     np = newname(".mo.r");
  207.     newline(np, 0, cp, 0);
  208.  
  209.     np = newname(".r");
  210.     dp = newdep(np, 0);
  211.     np = newname(".mc");
  212.     dp = newdep(np, dp);
  213.     np = newname(".mca");
  214.     dp = newdep(np, dp);
  215.     np = newname(".c");
  216.     dp = newdep(np, dp);
  217.     np = newname(".ca");
  218.     dp = newdep(np, dp);
  219.     np = newname(".ma");
  220.     dp = newdep(np, dp);
  221.     np = newname(".mo");
  222.     dp = newdep(np, dp);
  223.     np = newname(".o");
  224.     dp = newdep(np, dp);
  225.     np = newname(".a");
  226.     dp = newdep(np, dp);
  227.     np = newname(".SUFFIXES");
  228.     newline(np, dp, 0, 0);
  229. #endif
  230. #ifdef amiga
  231.     setmacro("CC", "cc");
  232.     setmacro("CFLAGS", "");
  233.     cp = newcmd("$(CC) $(CFLAGS) $<", NULL);
  234.     np = newname(".c.o");
  235.     newline(np, NULL, cp, 0);
  236.  
  237.     setmacro("AS", "as");
  238.     cp = newcmd("$(AS) -o $@ $<", NULL);
  239.     np = newname(".s.o");
  240.     newline(np, NULL, cp, NULL);
  241.  
  242.     np = newname(".o");
  243.     dp = newdep(np, NULL);
  244.     np = newname(".s");
  245.     dp = newdep(np, dp);
  246.     np = newname(".c");
  247.     dp = newdep(np, dp);
  248.     np = newname(".SUFFIXES");
  249.     newline(np, dp, NULL, 0);
  250. #endif
  251. }
  252.